package log

import (
	"GoControalBackend/common/config"
	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"github.com/sirupsen/logrus"
	"os"
	"path/filepath"
	"time"
)

// 日志组件

var log *logrus.Logger
var logToFile *logrus.Logger

// 日志文件名
var loggerFile string

// 设置日志文件的路径
// 参数: file: 日志文件的路径
func setLogFile(file string) {
	// 将日志文件路径赋值给全局变量loggerFile
	loggerFile = file
}

// 初始化
func init() {
	// 设置日志文件路径，使用配置中的日志路径和文件名
	setLogFile(filepath.Join(config.Config.Log.Path, config.Config.Log.Name))
}

// Log 日志方法调用
func Log() *logrus.Logger {
	// 如果配置中的日志模式为文件
	if config.Config.Log.Model == "file" {
		// 返回文件日志记录器
		return logFile()
	} else {
		// 如果日志记录器尚未初始化
		if log == nil {
			// 创建一个新的日志记录器
			log = logrus.New()
			// 设置日志输出为标准输出
			log.Out = os.Stdout
			// 设置日志格式为JSON格式，并指定时间戳格式
			log.Formatter = &logrus.JSONFormatter{TimestampFormat: "2008-01-01 15:04:05"}
			// 设置日志级别为调试级别
			log.SetLevel(logrus.DebugLevel)
		}
	}
	// 返回日志记录器
	return log
}

// 日志文件方法
func logFile() *logrus.Logger {
	// 检查 logToFile 是否为空
	if logToFile == nil {
		// 如果为空，创建一个新的 logrus.Logger 实例
		logToFile = logrus.New()
		// 设置日志级别为 Debug
		logToFile.SetLevel(logrus.DebugLevel)
		// 创建日志文件轮转写入器
		logWriter, _ := rotatelogs.New(
			// 分割后的文件名称
			loggerFile+"%Y%m%d.log",
			// 设置最大保存时间
			rotatelogs.WithMaxAge(30*24*time.Hour),
			// 设置日志切割时间间隔（1天）
			rotatelogs.WithRotationTime(24*time.Hour),
		)

		// 定义日志级别到写入器的映射
		writeMap := lfshook.WriterMap{
			logrus.InfoLevel:  logWriter,
			logrus.FatalLevel: logWriter,
			logrus.DebugLevel: logWriter,
			logrus.WarnLevel:  logWriter,
			logrus.ErrorLevel: logWriter,
			logrus.PanicLevel: logWriter,
		}

		// 设置时间格式
		lfHook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{
			TimestampFormat: "2006-01-02 15:04:05",
		})

		// 新增 Hook
		logToFile.AddHook(lfHook)
	}
	// 返回日志实例
	return logToFile
}
